\subsection{Ejercicio 3}

\indent En el ejercicio 3 se pedía crear e inicializar dos directorios y tablas de páginas según los mapas de memoria dados en el enunciado. \\
\indent Lo primero que se hizo fue en el archivo mmu.c la función \code{inicializar\_mmu()} que consistió en crear 2 punteros, uno a al primera página libre del kernel y otro a la primera página libre del usuario.\\
\indent Luego se hicieron las funciones \code{pagina\_libre\_usuario} y \code{pagina\_libre\_kernel} que si los punteros creados en la funcion anterior no apuntan al límite de la memoria, lo devuelven depende si pedimos pagina de usiario o de kernel y luego incrementan el puntador a la página siguiente. Si se llego al límite (dir 0x180000 en caso del kernel, 64MB en caso del usuario) devuelven 0.\\
\indent A continuación se pedía implementar una función que inicializara el directorio del kernel llamada \code{inicializar\_dir\_kernel()}.

La estructura de un descriptor de directorio de página es el siguiente:

\begin{center}
\includegraphics[scale=0.5]{descriptorpagina.jpg}
\end{center}

\begin{itemize}
	\item\code{Dirección}: se toman los \keyword{bits} 31 al 12 inclusive (20 \keyword{bits}) de la dirección de memoria recibida por el módulo 
de segmentación (dirección lineal) y esto servirá para localizar la tabla de página correspondiente.
	\item\code{Bit PS}: es el \keyword{bit} 7 y determina el tamaño de la pagina, que puede ser de 4Kb o 4Mb, pero para esto último se necesita que 
el modo \code{PSE} de paginación extendida esté activado (no requerido en el trabajo actual).
	\item\code{Bit A}: \code{Accessed}, determina si se escribió o leyó de una página o no. Es el \keyword{bit} 5.
	\item\code{Bit PCD}: este \keyword{bit} deshabilita el caché, por lo que permanecerá en 0. Es el \keyword{bit} 4.
	\item\code{Bit PWT}: es para habilitar el modo \code{Write-through} de la \keyword{caché}, no lo utilizamos.
	\item\code{Bit U}: determina el nivel de privilegio, si no esta \keyword{seteado}, el privilegio es de \code{Supervisor} (el mas alto). 
	\item\code{Bit R/W}: habilita la lectura y escritura en las páginas, lo requerimos en el trabajo.
	\item\code{Bit P}: dice si la pagina esta presente en la memoria. Lo habilitamos para no producir una \code{Page Fault}.
\end{itemize}

La función toma la primer pagina libre de kernel y crea el diectorio del kernel. Setea todas las entradas con el Bit de Supervisor (en 0 porque es supervisor), con el Bit de Read/Write y en No-Presente. Luego pide otra página libre y inicializa la primer tabla de paginas, con el Bit de Supervisor, R/W y No-Presente. Luego asigna la tabla de páginas a la primer entrada del directorio y la pone en Presente.
\indent Después de tener inicializados los directorios se copia la dirección del directorio de páginas de \keyword{kernel} al \code{cr3} 
y se habilita la paginación poniendo en 1 el \keyword{bit} más significativo del \code{cr0}. 


\indent  En la segunda parte del ejercicio, pide escribir el nombre del grupo en la esquina superior izquierda. Para ello, se accede a la memoria de video a 
través de su respectivo segmento definido en la \code{GDT}.Para esto utilizamos la función auxiliar definida en el archivo \code{klib.asm} llamada \code{kprintf}.

\subsection{Preguntas}
\begin{itemize}
\item 	Pregunta 4: ¿Es posible mapear una página de 4 Kb que se encuentra dentro de otra página de 4 Mb que se ya encuentra mapeada? Realice el pseudocódigo necesario. 
\end{itemize}
Sí, es posible. Pero al costo de perder el mapeo de la página de 4Mb.

Una página de 4Mb está mapeada de modo que la entrada correspondiente en el directorio de páginas indique la base de dicha página (dirección física).
Cuando la MMU necesita convertir una dirección virtual perteneciente a una página de 4Mb en una dirección física, sólo necesita acceder al directorio de páginas e indexar con los 10 bits más significativos de la dirección virtual, y usar los 22bits restantes como offset dentro de esa página.

El problema surge al querer mapear una página de 4Kb a una dirección física contenida en la página de 4MB, dado ambas comparten la misma entrada en el directorio.
Para que la MMU reconozca una página de 4Mb, en la entrada de directorio, debe estar activado el bit 7 (Page Size). Pues de lo contrario, asumirá que la dirección física presente en esa entrada es el de una tabla de páginas, y no de una página.



